package com.heima.uesr.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.uesr.mapper.ApUserMapper;
import com.heima.uesr.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

@Service
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {


    /**
     * 用户登录和游客登录
     * @param dto
     * @return
     */
    @Override
    public ResponseResult login(LoginDto dto) {

        //1. 判断dto中是否有手机号和密码 如果有则走正常的登录 如果没有则走游客登录
        if (dto.getPassword() == null || dto.getPhone() == null) {
            //游客登录
            //生成token
            String token = AppJwtUtil.getToken(0L);

            Map<String, Object> result = new HashMap<>();
            result.put("token", token);

            return ResponseResult.okResult(result);
        } else {
            //2. 正常的登录 -通过手机号查询用户 如果没有查询到用户则返回 用户或密码错误
            ApUser apUser = getOne(Wrappers.<ApUser>lambdaQuery()
                    .eq(ApUser::getPhone, dto.getPhone()).eq(ApUser::getStatus, 0));
            if (apUser == null) {
                return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST);
            }
            //3. 如果查询到了用户 则获取到用户的盐
            String salt = apUser.getSalt();

            //4. 获取到盐以后结合密码进行md5加密 得到一个新的密文 -易错点: 这里只能用密码+盐 如果顺序反了 密码就错了
            String _pwd = DigestUtils.md5DigestAsHex((dto.getPassword() + salt).getBytes(
                    Charset.forName("UTF-8")));

            //5. 比较密码是否一样 如果一样则登录成功 生成token 如果不一样则返回 用户或密码错误
            if (_pwd.equals(apUser.getPassword())) {
                //登录成功

                //对用户做脱敏处理
                apUser.setSalt("");
                apUser.setPassword("");

                //生成token
                String token = AppJwtUtil.getToken(apUser.getId().longValue());

                Map<String, Object> result = new HashMap<>();
                result.put("user", apUser);
                result.put("token", token);

                return ResponseResult.okResult(result);
            } else {
                return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST);
            }

        }
    }
}
